//=====================================================================
//    COPYRIGHT(C) Innobeam
//    ALL RIGHTS RESERVED
//=====================================================================
//Filename    : Bin2BDC16.v
//Created On  : 2019-01-02
//Author      : Chao
//Description : 16 bit bin to 19 bit dec
//Include     : 
//Modification: 
//=====================================================================
module Bin2BCD16(
	A, 
	B
	);
input 	[15:0] 	A;
output 	[19:0] 	B;

wire [3:0] c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13;
wire [3:0] c14, c15, c16, c17, c18, c19, c20, c21, c22, c23;
wire [3:0] c24, c25, c26, c27, c28, c29, c30;
wire [3:0] c31, c32, c33, c34;

wire [3:0] d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13;
wire [3:0] d14, d15, d16, d17, d18, d19, d20, d21, d22, d23;
wire [3:0] d24, d25, d26, d27, d28, d29, d30;
wire [3:0] d31, d32, d33, d34;

assign d1 = {1'b0, A[15:13]};
assign d2 = {c1[2:0], A[12]};
assign d3 = {c2[2:0], A[11]};
assign d4 = {c3[2:0], A[10]};
assign d5 = {c4[2:0], A[9]};
assign d6 = {c5[2:0], A[8]};
assign d7 = {c6[2:0], A[7]};
assign d8 = {c7[2:0], A[6]};
assign d9 = {c8[2:0], A[5]};
assign d10 = {c9[2:0], A[4]};
assign d11 = {c10[2:0], A[3]};
assign d12 = {c11[2:0], A[2]};
assign d13 = {c12[2:0], A[1]};

assign d14 = {1'b0, c1[3], c2[3], c3[3]};
assign d15 = {c14[2:0], c4[3]};
assign d16 = {c15[2:0], c5[3]};
assign d17 = {c16[2:0], c6[3]};
assign d18 = {c17[2:0], c7[3]};
assign d19 = {c18[2:0], c8[3]};
assign d20 = {c19[2:0], c9[3]};
assign d21 = {c20[2:0], c10[3]};
assign d22 = {c21[2:0], c11[3]};
assign d23 = {c22[2:0], c12[3]};

assign d24 = {1'b0, c14[3], c15[3], c16[3]};
assign d25 = {c24[2:0], c17[3]};
assign d26 = {c25[2:0], c18[3]};
assign d27 = {c26[2:0], c19[3]};
assign d28 = {c27[2:0], c20[3]};
assign d29 = {c28[2:0], c21[3]};
assign d30 = {c29[2:0], c22[3]};

assign d31 = {1'b0, c24[3], c25[3], c26[3]};
assign d32 = {c31[2:0], c27[3]};
assign d33 = {c32[2:0], c28[3]};
assign d34 = {c33[2:0], c29[3]};

Bin2BCD_Add3 m1(d1, c1);
Bin2BCD_Add3 m2(d2, c2);
Bin2BCD_Add3 m3(d3, c3);
Bin2BCD_Add3 m4(d4, c4);
Bin2BCD_Add3 m5(d5, c5);
Bin2BCD_Add3 m6(d6, c6);
Bin2BCD_Add3 m7(d7, c7);
Bin2BCD_Add3 m8(d8, c8);
Bin2BCD_Add3 m9(d9, c9);
Bin2BCD_Add3 m10(d10, c10);
Bin2BCD_Add3 m11(d11, c11);
Bin2BCD_Add3 m12(d12, c12);
Bin2BCD_Add3 m13(d13, c13);

Bin2BCD_Add3 m14(d14, c14);
Bin2BCD_Add3 m15(d15, c15);
Bin2BCD_Add3 m16(d16, c16);
Bin2BCD_Add3 m17(d17, c17);
Bin2BCD_Add3 m18(d18, c18);
Bin2BCD_Add3 m19(d19, c19);
Bin2BCD_Add3 m20(d20, c20);
Bin2BCD_Add3 m21(d21, c21);
Bin2BCD_Add3 m22(d22, c22);
Bin2BCD_Add3 m23(d23, c23);

Bin2BCD_Add3 m24(d24, c24);
Bin2BCD_Add3 m25(d25, c25);
Bin2BCD_Add3 m26(d26, c26);
Bin2BCD_Add3 m27(d27, c27);
Bin2BCD_Add3 m28(d28, c28);
Bin2BCD_Add3 m29(d29, c29);
Bin2BCD_Add3 m30(d30, c30);

Bin2BCD_Add3 m31(d31, c31);
Bin2BCD_Add3 m32(d32, c32);
Bin2BCD_Add3 m33(d33, c33);
Bin2BCD_Add3 m34(d34, c34);

assign B = {c31[3], c32[3], c33[3], c34[3:0], c30[3:0], c23[3:0], c13[3:0], A[0]};

endmodule

//===============================================================================
module Bin2BCD_Add3(
	in4,
	out4
	);
input 	[3:0] 	in4;
output 	[3:0] 	out4;
reg 		[3:0] 	out4;

always @(in4)
	case(in4)
	4'b0000: out4 <= 4'b0000;
	4'b0001: out4 <= 4'b0001;
	4'b0010: out4 <= 4'b0010;
	4'b0011: out4 <= 4'b0011;
	4'b0100: out4 <= 4'b0100;
	4'b0101: out4 <= 4'b1000;
	4'b0110: out4 <= 4'b1001;
	4'b0111: out4 <= 4'b1010;
	4'b1000: out4 <= 4'b1011;
	4'b1001: out4 <= 4'b1100;
	default: out4 <= 4'b0000;
	endcase
endmodule